

# 1.定义函数时在形参前有 * 和 **
# 形参前带 '*' ,可以接受多个位置参数(会形成一个元祖,对应的多个实参是元祖中的一个元素)
# 形参前带 '**', 可以接受多个关键字参数传参(形成一个字典,以参数名为key,参数值作为value)
# 函数有位置参数(实参和形参在位置上一一对应)和关键字参数(以'参数名 = 值'的方式传递参数)
# 关键字参数是在需要跳过前面某个或某几个参数是使用(直接用参数名=参数值赋值)
# 注意:位置参数和关键字参数同时使用,位置参数写在前面,关键字参数写在后面
def function(name, *args, **kwargs):
    pass


# 2.* 和 ** 分别在列表和字典前
# '*' 在列表前将列表解包,解除里面元素的序列化
# '**' 在字典前将字典解包, 将字典的value值取出
def func1(x, y):
    print(x, y)


list1 = [1, 2]
func1(*list1)
# 1 2 3 4

dict1 = {'x': 1, 'y': 2}
func1(**dict1)
# 1 2

# '*' 在赋值语句前
# 从可迭代对象(元祖, 列表, 字符串, 文件, 迭代器, 生成器)中分解出元素
data = ['ACME', 50, 91.1, (2019, 10, 16)]

name, *middle, (year, *last) = data

print(middle)
# [50, 91.1]

print(last)
# [10, 16]

from collections import deque


def search(lines, pattern, history=5):
    previous_lines = deque(maxlen=history)
    for line in lines:
        if pattern in line:
            yield line, previous_lines
        previous_lines.append(line)


if __name__ == '__main__':
    with open('somefile.txt') as f:
        for line, prevlines in search(f, 'python', 5):
            for pline in prevlines:
                print(pline, end='')
            print(line, end='')
            print('-' * 20)

